#include <bits/stdc++.h>
using namespace  std;

using i64 = long long;
void solve(){
    int n ,m; // 定义行数n和列数m
    cin >> n >> m; // 输入行数和列数
    vector<string> s(n); // 定义一个字符串向量s，用于存储每一行的覆盖情况
    for(int i = 0;i < n ; i ++){ // 遍历每一行
        cin >> s[i]; // 输入每一行的覆盖情况
    }
    int ok = 1; // 定义一个变量ok，用于判断覆盖是否正确，初始值为1（正确）
    vector cnt(n, vector<array<int,2>>(m)); // 定义一个三维向量cnt，用于存储每个单元格的覆盖情况
    for(int i = 0; i < n ; i ++){ // 遍历每一行
        for(int j = 0; j < m; j ++){ // 遍历每一列
            if(s[i][j] == '.' != (i==0 && j == m -1)){ // 如果当前单元格未被覆盖且不在第一行最后一列，则覆盖不正确
                ok = 0;
            }
            if(s[i][j] != '.' && s[i][j] != 'C'){ // 如果当前单元格被覆盖且不是中心点
                int x = i, y = j; // 定义变量x和y，用于记录当前单元格的行号和列号
                int z = 0; // 定义变量z，用于记录当前单元格的方向（0表示上下方向，1表示左右方向）
                if (s[i][j] == 'L'){ // 如果当前单元格向左覆盖
                    y --;
                }else if (s[i][j] == 'R'){ // 如果当前单元格向右覆盖
                    y ++;
                }else if (s[i][j] == 'U') { // 如果当前单元格向上覆盖
                    z = 1;
                    x--;
                }else{ // 如果当前单元格向下覆盖
                    z = 1;
                    x ++;
                }
                if(0 <= x && x <n && 0 <= y && y < m && s[x][y] == 'C'){ // 如果覆盖的中心点在网格内且为中心点
                    cnt[x][y][z] ++; // 更新中心点的覆盖情况
                }else{ // 如果覆盖的中心点不在网格内或不是中心点
                    ok = 0; // 覆盖不正确
                }
            }
        }

    }
    for(int i = 0; i < n ; i++){ // 遍历每一行
        for(int j = 0; j < m ; j ++){ // 遍历每一列
            if(s[i][j] == 'C' && (cnt[i][j][0] != 1 || cnt [i][j][1] != 1)){ // 如果当前单元格为中心点且其上下或左右的覆盖情况不正确
                ok = 0; // 覆盖不正确
            }
        }
    }
    if (ok){ // 如果覆盖正确
        cout << "Yes\n" ; // 输出Yes
    }else{cout << "No\n";} // 如果覆盖不正确，输出No
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t; // 定义变量t，用于存储测试用例的数量
    cin >> t; // 输入测试用例的数量
    while( t -- ){ // 遍历每个测试用例
        solve(); // 调用solve函数处理每个测试用例
    }
}
